Skip to main content

Disabling/Pausing Queries


禁用自动运行查询,可以说使用enabled = false 选项。

enabledfalse时:

  • 如果查询具有缓存数据,则查询将在status === 'success'isSuccess状态下初始化。
  • 如果查询没有缓存数据,则查询将在status === 'loading'fetchStatus === 'idle'状态下开始。
  • 查询不会在挂载时自动获取数据。
  • 查询不会在后台自动重新获取数据。
  • 查询将忽略查询客户端的invalidateQueriesrefetchQueries调用,这些调用通常会导致查询重新获取。
  • useQuery返回的refetch可以用于手动触发查询。

永久禁用查询会使您无法使用TanStack Query提供的许多优秀功能(如后台重新获取),并且这也不是惯用的方式。它将您从声明性方法(在定义查询何时运行时定义依赖项)转变为命令式模式(无论何时单击此处,都会进行获取)。还无法传递参数进行重新获取。通常,您只需要一个(延迟查询)lazy query来推迟初始获取:

Lazy Queries(延迟查询)

enabled选项不仅可用于永久禁用查询,还可以在以后的某个时间启用/禁用它。(条件启用enabled)

function Todos() {
const [filter, setFilter] = React.useState('')

const { data } = useQuery({
queryKey: ['todos', filter],
queryFn: () => fetchTodos(filter),
// ⬇️ disabled as long as the filter is empty
enabled: !!filter
})

return (
<div>
// 🚀 applying the filter will enable and execute the query
<FiltersForm onApply={setFilter} />
{data && <TodosTable data={data}} />
</div>
)
}

isInitialLoading (禁用或者延迟查询情况下loading 指示)

延迟查询在开始时将处于status: 'loading'状态,因为loading意味着尚无数据。从技术上讲,这是正确的,然而,由于我们当前没有获取任何数据(因为查询未启用),这也意味着您可能无法使用此标志显示加载指示器

如果您正在使用禁用或延迟查询,可以使用isInitialLoading标志。它是一个派生标志,通过以下计算得出:

isLoading && isFetching

因此,只有在查询首次进行获取时才会为true。